package cn.bearspark.framework.web.starter.interceptor;

import cn.bearspark.common.enumeration.RequestHeaderNameEnum;
import cn.bearspark.framework.web.starter.context.BSRequestContext;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

/**
 * 解析 token 的拦截器
 * <p>
 * 把 token 中的重要字段直接放在本地线程空间中，便于之后再次使用
 *
 * @author f
 */
@Component
public class TokenParseInterceptor implements HandlerInterceptor {

    /**
     * 在处理请求之前将重要信息存储到本地线程空间中
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        String userIdStr = request.getHeader(RequestHeaderNameEnum.USER_ID.getName());
        // 参数判断，userId 是否为空，可能是白/灰名单 url
        if (!StringUtils.hasLength(userIdStr)) {
            return true;
        }
        // 如果 userId 不为空，则把它放在线程本地变量里面去
        BSRequestContext.setUserId(Long.valueOf(userIdStr));
        return true;
    }

    /**
     * 在处理请求之后清除本地线程空间中的信息
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                           ModelAndView modelAndView) throws Exception {
        BSRequestContext.clear();
    }

}
